﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using KZ.Express.H.ENT;
using KZ.Utilities;
using System.Data;

namespace KZ.Express.H.BLL
{
    public class SupplierBLL : BaseBLL, IBaseBLL
    {
        public override object Insert(BaseENT entity)
        {
            try
            {
                SupplierENT supplier = entity as SupplierENT;

                _dal.BeginTransaction();

                supplier.ValidateData();
                supplier.SupplierID = Utility.IntParse(_dal.Insert(supplier));

                if (supplier.SupplierID == -1)
                    throw new BusinessLogicException("Tên nhà cung cấp đã tồn tại, bạn vui lòng nhập tên nhà cung cấp khác khác");
                else if (supplier.SupplierID == -2)
                    throw new BusinessLogicException("Dữ liệu có tên nhà cung cấp này đã bị xóa, bạn có muốn khôi phục lại?");

                foreach (SupplierCarrierENT suppliercarrier in supplier.SuppliersCarriers)
                {
                    suppliercarrier.SupplierID = supplier.SupplierID;
                    _dal.Insert(suppliercarrier);
                }

                _dal.CommitTransaction();
                return supplier.SupplierID;
            }
            catch (DataAccessException ex)
            {
                _dal.RollbackTransaction();
                throw new BusinessLogicException(ex.Message);
            }
        }

        public override object Update(BaseENT entity)
        {
            try
            {
                SupplierENT supplier = entity as SupplierENT;

                _dal.BeginTransaction();

                supplier.ValidateData();
                supplier.SupplierID = Utility.IntParse(_dal.Update(supplier));

                if (supplier.SupplierID == -1)
                    throw new BusinessLogicException("Tên nhà cung cấp đã tồn tại, bạn vui lòng nhập tên nhà cung cấp khác khác");

                foreach (SupplierCarrierENT suppliercarrier in supplier.SuppliersCarriers)
                    _dal.Insert(suppliercarrier);

                foreach (DataRow dr in _dal.GetDataTable<CarrierENT>(null).Rows)
                {
                    if (supplier.SuppliersCarriers.Where(d => d.CarrierID == Utility.IntParse(dr["CarrierID"])).Count() == 0)
                    {
                        SearchCriteria search = new SearchCriteria();
                        search.Add("SupplierID",supplier.SupplierID);
                        search.Add("CarrierID",Utility.IntParse(dr["CarrierID"]));
                        _dal.ExecuteNonQuery(SupplierCarrierENT.Delete,search,null);
                    }
                }

                _dal.CommitTransaction();
                return supplier.SupplierID;
            }
            catch (DataAccessException ex)
            {
                _dal.RollbackTransaction();
                throw new BusinessLogicException(ex.Message);
            }
        }
    }
}
